package com.linkai.JUC._06_assist;

import java.util.concurrent.CountDownLatch;

/**
 * @Description: 辅助类：CountDownLatch 的使用：减法计数器
 *              基于 AQS的实现，继承了 AbstractQueuedSynchronizer 类
 *              底层原理：
 *                  （1）任务分 N 个子线程去执行，state就初始化为 N，N个线程并行执行
 *                  （2）每个线程执行完之后 countDown() 一次，state 就会 CAS 减一
 *                  （3）当 N 子线程全部执行完毕，state=0，会 unpark() 主调用线程，主调用线程就会从 await() 函数返回，
 *                      继续之后的动作。
 *
 * @Author: 林凯
 * @Date: 2021/10/24 15:39
 */
public class CountDownLatchDemo01 {
    public static void main(String[] args) throws InterruptedException {
        // 总数是6，必须要执行任务的时候，再使用
        CountDownLatch countDownLatch = new CountDownLatch(6);

        // 等待这6个线程执行完毕，才会继续向下执行
        /*
            等待这6个线程执行完毕，才会继续向下执行
            应用场景：
                假设开100个线程，往 list 里面添加数据，最后 main 线程查看这个 list 的长度。
                必须保证 main 线程在 100 个线程执行完毕之后再执行，这种情况下就可以使用 CountDownLatch
                （但是这100个线程的执行顺序是随机的）
        * */
        for (int i = 1; i <= 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName() + " go out");
                countDownLatch.countDown(); // -1
            }).start();
        }
        countDownLatch.await();  // 等待计数器归零，然后再向下执行
        System.out.println("close door");

    }
}
